#include "usb_lib.h"
#include "usb_desc.h"
#include <pebble.h>

// USB Standard Device Descriptor
const ubyte CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC]={
	CUSTOMHID_SIZ_DEVICE_DESC,		// bLength
	USB_DEVICE_DESCRIPTOR_TYPE,		// bDescriptorType
	0x00,0x02,						// bcdUSB v2.0
	0x00,							// bDeviceClass
	0x00,							// bDeviceSubClass
	0x00,							// bDeviceProtocol
	0x40,							// bMaxPacketSize40
	HID_VENDOR&0xff,HID_VENDOR>>8,	// idVendor
	HID_PRODUCT&0xff,HID_PRODUCT>>8,// idProduct
	0x00,0x01,                     	// bcdDevice r1.0
	1,		// Index of string descriptor describing manufacturer
	2,		// Index of string descriptor describing product
	3,		// Index of string descriptor describing the device serial number
	0x01							// bNumConfigurations
}; // CustomHID_DeviceDescriptor
// USB Configuration Descriptor
// All Descriptors (Configuration, Interface, Endpoint, Class, Vendor
const ubyte CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] ={
	0x09,		// bLength: Configuation Descriptor size
	USB_CONFIGURATION_DESCRIPTOR_TYPE,	// bDescriptorType: Configuration
	CUSTOMHID_SIZ_CONFIG_DESC,0x00,		// wTotalLength: Bytes returned
	0x01,		// bNumInterfaces: 1 interface
	0x01,		// bConfigurationValue: Configuration value
	0x00,		// iConfiguration: Index of string descriptor describing
				//   the configuration
	0xC0,		// bmAttributes: Bus powered
	0x32,		// MaxPower 100 mA: this current is used for detecting Vbus
	// 09: Descriptor of Custom HID interface
	0x09,		// bLength: Interface Descriptor size
	USB_INTERFACE_DESCRIPTOR_TYPE,// bDescriptorType: Interface descriptor type
	0x00,		// bInterfaceNumber: Number of Interface
	0x00,		// bAlternateSetting: Alternate setting
	0x02,		// bNumEndpoints
	0x03,		// bInterfaceClass: HID
	0x00,		// bInterfaceSubClass : 1=BOOT, 0=no boot
	0x00,		// nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
	0,			// iInterface: Index of string descriptor
	// 18: Descriptor of Custom HID HID
	0x09,		// bLength: HID Descriptor size
	HID_DESCRIPTOR_TYPE,// bDescriptorType: HID
	0x10,		// bcdHID: HID Class Spec release number
	0x01,
	0x00,		// bCountryCode: Hardware target country
	0x01,		// bNumDescriptors: Number of HID class descriptors to follow
	0x22,		// bDescriptorType
	CUSTOMHID_SIZ_REPORT_DESC,// wItemLength: Total length of Report descriptor
	0x00,
	// 27: Descriptor of Custom HID endpoints
	0x07,		// bLength: Endpoint Descriptor size
	USB_ENDPOINT_DESCRIPTOR_TYPE,// bDescriptorType:
	0x01,		// bEndpointAddress: Endpoint Address (OUT)
	0x03,		// bmAttributes: Interrupt endpoint
	0x40,		// wMaxPacketSize: 2 Bytes max
	0x00,
	0x20,		// bInterval: Polling Interval (2 ms)
	// 34:
	0x07,	// bLength: Endpoint Descriptor size
	USB_ENDPOINT_DESCRIPTOR_TYPE,// bDescriptorType:
	// Endpoint descriptor type
	0x82,	// bEndpointAddress: Endpoint Address (IN)
	0x03,	// bmAttributes: Interrupt endpoint
	0x40,	// wMaxPacketSize: 2 Bytes max
	0x00,
	0x20,	// bInterval: Polling Interval (32 ms)
	// 41:
}; // CustomHID_ConfigDescriptor
const ubyte CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] ={
    0x05, 0xFF,				// USAGE_PAGE(User define)
    0x09, 0xFF,				// USAGE(User define)
    0xa1, 0x01,				// COLLECTION (Application)

    0x05, 0x01,				// USAGE_PAGE(1)
    0x19, 0x00,				//   USAGE_MINIMUM(0)
    0x29, 0xFF,				//   USAGE_MAXIMUM(255)
    0x15, 0x00,				//   LOGICAL_MINIMUM (0)
    0x25, 0xFF,				//   LOGICAL_MAXIMUM (255)
    0x75, 0x08,				//   REPORT_SIZE (8)
    0x95, 0x40,				//   REPORT_COUNT (64)
    0x81, 0x02,				//   INPUT (Data,Var,Abs)

	0x05, 0x02,				// USAGE_PAGE(2)
    0x19, 0x00,				//   USAGE_MINIMUM (0)
    0x29, 0xFF,				//   USAGE_MAXIMUM (255)
    0x15, 0x00,				//   LOGICAL_MINIMUM (0)
    0x25, 0xFF,				//   LOGICAL_MAXIMUM (255)
    0x75, 0x08,				//   REPORT_COUNT (8)
    0x95, 0x40,				//   REPORT_SIZE (64)
    0x91, 0x02,				//   OUTPUT (Data,Var,Abs)
    0xc0					// END_COLLECTION	
}; // CustomHID_ReportDescriptor

// USB String Descriptors (optional)
const ubyte CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] ={
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,0x04				// LangID = 0x0409: U.S. English
};

const ubyte CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]={
    CUSTOMHID_SIZ_STRING_VENDOR,	// Size of Vendor string
    USB_STRING_DESCRIPTOR_TYPE,		// bDescriptorType
    /* Manufacturer: "STMicroelectronics" */
    'B', 0, 'M', 0, 'E', 0, '1', 0, '0', 0, '5', 0
};

const ubyte CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT]={
    CUSTOMHID_SIZ_STRING_PRODUCT,	// bLength
    USB_STRING_DESCRIPTOR_TYPE,		// bDescriptorType
    'K', 0, 'a', 0, 'l', 0, 'K', 0, 'r', 0, '-', 0, '-', 0,
    'P', 0, 'H', 0, 'O', 0, 'X', 0, 'E', 0, 'L', 0, 'L', 0
};

ubyte CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL]={
    CUSTOMHID_SIZ_STRING_SERIAL,	// bLength
    USB_STRING_DESCRIPTOR_TYPE,		// bDescriptorType
    '6',0,'D',0,'8',0,'7',0,'5',0,'0',0,'7',0,'A',0
};
